"""
!/usr/bin/env python
-*- coding: utf-8 -*-
@Author  : MarkJia
@Site    : 
@File    : 25、page object.py
"""

"""
page object 模式简介
page object 设计原则

selenium的官方文档  :
马丁福勒个人博客 ： https://mantinfowler.com/bliki/PogeObject.html

传统的线性用例劣势：
1、无法适应 UI 变化
2、无法清晰的表达业务的用例场景
3、大量的样板代码： driver   find_element   click  不够优雅

为什么需要Page Object 设计模式
1、降低ui变化导致的测试用例脆弱性
2、让用例清晰明朗，与具体实现无关
3、分层思想：高类聚、低耦合

PO模式-分层:
页面层：元素定位，元素操作
        操作细节  ： 对主要的操作建模：封装成一个方法（接口）- method 和 属性
        把元素信息和操作细节封装到 PageObject 类中
    

用例层：具体的业务步骤
        结果验证  ： 调用封装的操作，加上断言
        根据业务逻辑，在测试用例中链式调用

PageObject ： 页面对象 ： 每一个页面都是一个页面对象。包括页面提供的方法（操作），页面提供的元素（属性）
PO模式 ： 是一种设计模式，通用的设计方法   PageObjectModel - POM


POM 建模原则：
字段意义：
1、不要暴露页面元素给外部  加上 _（保护属性）  加上 __（私有属性）
2、不要建模 ui 内的所有元素
方法意义：
1、用公共的方法代表 ui 提供的功能
2、方法应该返回其他的 PageObject 或者 返回用于断言的数据
3、同样的行为不同的结果可以建模为不同的方法
4、不要在方法中加断言（测试用例断言）


"""
